Windows内核编程(五) | 您所在的位置:网站首页 › windows驱动编程 管理内核对象 › Windows内核编程(五) |
驱动的调试
为了安全起见,驱动调试应该在虚拟机中进行,本书中所有提及的驱动调试,都是指通过Vmware(或其他虚拟机)运行一个虚拟机操作系统,在该操作系统中运行被调试的驱动,开发者在物理机器上使用内核调试工具(如 Windbg),通过网络、USB、串口、1394等方式连接到虚拟机操作系统,进行驱动调试。为了表述清晰,下面把物理机器称为调试机器,把运行被调试驱动的虚拟机称为被调试机器。 基于VS + WDK环境调试 调试环境调式机器:Windows 10 WDK10 调式机器IP:192.168.0.110 虚拟机:vmware 16 被调式机器:Windows 10 被调式机器IP:192.168.247.129 两台机器的IP必须是互通的,如果ping不同请检查防火墙的入站规则,打开以下两项 在被调试机器中:以管理员权限运行cmd(命令提示符),在命令中输入:bcdedit /debug on,然后回车。这条命令的作用是把被调试机器设置成调试模式。 在命令行中输入:bcdedit /dbgsettings net hostip:192.168.0.110 port:50010 并回车,这条命令的意思是使用网络进行调试的连接方式,hostip指调试机器的IP,在笔者电脑上是192.168.0.110 ,port表示所使用网络的端口,建议范围是49152 至65535,笔者指定的端口为50010。在上面的命令执行完之后,cmd命令行上会显示一个Key,读者需要保存这个Key,用于后面调试机器的配置。 完成配置后请点击“下一步”按钮,进入“configure debugger settings”配置页,在“Windows Debugger – Kernel Mode”下面,找到“Connection Type”,在下拉框中选择“Network”;在“Port Number”中填入被调试机器中配置的端口值50010;在“Key”中填入被调试机器中生成的Key,本例中Key为14lmsrfrbt8or.1atk4n7oehhyc.ta6470s5hu20.1ch1jab41ul2d;在HostIp中填入调试机器的IP,本例为192.168.247.129;如果被调试机器只有一个网卡,最后一个“bus Parameters”可以不填,否则需要根据PCI规范,填入相应设备的总线号(Bus number)、设备号(Device Number)以及功能号(Function number),笔者的被调试机器只有一块网卡,所以这个值留空,如下图所示。完成配置后点击“完成”按钮。这样就完成了VS的配置。
一切准备妥当后,下面准备以前面MyDriver驱动来作为调试对象,开始调试前,首先修改一下MyDriver驱动的入口函数,在DriverEntry入口函数中加入一个断点KdBreakPoint(),这样当MyDriver运行的时候,就会在DriverEntry触发这个断点而停止下来,这是一个常用的技巧。 请注意,KdBreakPoint只对Debug版的驱动有效,如果需要对Release版本的驱动放置断点代码,请使用DbgBreakPoint。修改后的DriverEntry函数如下: 基于Windbg工具。实际上通过VS调试驱动,内部也是基于Windbg的内核。 如果读者安装较新版的WDK,可以在WDK的安装目录中找到Windbg,笔者把WDK安装在D:\Windows Kits目录下,则64位的Windbg位置为:D:\Windows Kits\10\Debuggers\x64\Windbg.exe;32位的Windbg位置为:D:\Windows Kits\10\Debuggers\x86\Windbg.exe。 如果读者安装较老版本的WDK,WDK内不包含Windbg,可能需要到微软的官方网站下载独立的Windbg安装包。 上面介绍了如何通过网络作为介质连接调试机器与被调试机器,下面换一个方式,选用串口(COM口)作为连接介质。 。在被调试机器内,以管理员权限打开cmd(命令提示符),然后输入: bcdedit /debug on 并按“回车”键,接着输入:bcdedit /dbgsettings serial baudrate:115200 debugport:2并按“回车”键。第一条命令读者应该很熟悉了,表示把机器设置成调试模式,第二条命令是设置通过串口2来作为连接介质,串口的波特率为115200。命令执行完之后如下图所示。 上面介绍的是在现有的启动项上修改启动参数,在某些场景下,还可以通过bcdedit(XP下是boot.ini文件)增加一个启动项,新增的启动项用于调试。由于本例中的虚拟机的直接用途就是调试,所以直接修改现有的启动项即可。 配置完成后,请关闭虚拟机内的操作系统,然后在Vmware的配置界面,新增一个串口设备,设置该串口使用“命名管道”,名字为:\.\pipe\com_2,具体配置如图所示。 被调试机器所需的设置已经全部完成。接下来开始配置Windbg,首先找到Windbg.exe文件所在的目录,请参考本节前面所提及的位置,在笔者电脑上是D:\Windows Kits\10\Debuggers\x64\Windbg.exe,然后右键点击Windbg.exe文件,选择“发送到”→“桌面快捷方式”。在桌面上找到Windbg的快捷方式,点击右键,选择“属性”,在“快捷方式”分页下,找到“目标”,填入:“D:\Windows Kits\10\Debuggers\x64\Windbg.exe” -b -k com:pipe,port=\.\pipe\com_2,resets=0。Windbg启动后会去连接\.\pipe\com_2管道。 一切准备就绪后,首先开启虚拟机,然后打开桌面的Windbg快捷方式,稍微等待一下,Windbg就可以连接上被调试机器了,如图所示。 与VS调试驱动类似,请读者把MyDriver.sys放在被调试机器的系统中,如C:\MyDriver.sys,然后通过sc create、sc start命令启动驱动,驱动执行入口函数中的KdBreakPoint会中断到Windbg中,如图所示。 |
CopyRight 2018-2019 实验室设备网 版权所有 |